#include "UdpServer.hpp"
#include "Dictionary.hpp"
//为什么回调：类中的方法封装成可调用对象传给另一个类，之间的耦合是用回调的机制产生耦合  
//回调的依据：lambda能捕获指向翻译模块的指针(帮助找到这个方法地址)，lambda能生成一个可调用对象,所有的内容都在main.cc里面展开了                                                                                                                            
//回调的方法：你想用我的方法，我把我的方法封装成对象传给你，你来回调我               


int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        std::cerr << "Usage: " << argv[0] << "localport" << std::endl;
        exit(USAGE_ERR);
    }
    //std::string ip = argv[1];
    uint16_t port = std::stoi(argv[1]);

    ENABLE_CONSOLE_LOG();
    std::shared_ptr<Dictionary> dict_sptr = std::make_shared<Dictionary>();//数据处理模块对象
    dict_sptr->Print();

    //这个是利用传lambda对象给服务器对象
    //这个lambda(仿函数对象)需要一个string& word,就是服务器用来接收数据，内部再去回调lambda对象，从而将数据接收模块和数据处理模块进行了低耦合
    /*std::unique_ptr<UdpServer> svr_uptr = std::make_unique<UdpServer>([&dict_sptr](const std::string word)
    {
        std::cout<<word<<std::endl;
        return dict_sptr->Translate(word);
    },port);*/
    std::unique_ptr<UdpServer> svr_uptr = std::make_unique<UdpServer>(std::bind(&Dictionary::Translate,dict_sptr->get(),std::placeholders::_1),port);//生成一个可调用对象去调用Translate，并且没有固定参数
    //内部也是 return dict_sptr->Translate(word)，只不过是编译器自己做的可以看成绑定后自动调用，而lambda中我们需要自己去调用，反正对象指针不可少
    svr_uptr->InitServer();
    svr_uptr->Start();

    return 0;
}